﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Sql;
using EntitiesLayer;
using System.Data.SqlClient;
using System.Data;
using DAO_SQLServer;
using Bitacora;
namespace DataLayer
{
    public static class SqlDataClass
    {

        public static void ProbarConnection(bool data=true)
        {
            if (data)
                SQL_Manager.stringConection = Configuracion.cadenaConexionBDData;
            else
                SQL_Manager.stringConection = Configuracion.cadenaConexionBDIIF;

            SQL_Manager.AbrirConexion();
            SQL_Manager.CerrarConexion();
        }
        
        public static int InsertarSql(Cheque  data)
        {
            List<SqlParameter> parametros = new List<SqlParameter>();
            
            foreach (Field field in data.camara.camposValidos)
            {
                if (field.requerido)
                {
                    SqlParameter parameter = new SqlParameter("@ps" + field.nombreBaseDatos, SqlDbType.VarChar);
                    parameter.Direction = ParameterDirection.Input;
                    parameter.Value = field.valor;
                    parametros.Add(parameter);
                }
            }

            SqlParameter p = new SqlParameter("@piEstado", SqlDbType.Int);
            p.Direction = ParameterDirection.Input;
            p.Value = data.estado;
            parametros.Add(p);
            
            p = new SqlParameter("@psCamara", SqlDbType.VarChar);
            p.Direction = ParameterDirection.Input;
            p.Value = data.camara.identificador;
            parametros.Add(p);

            p = new SqlParameter("@psDireccion_Data", SqlDbType.VarChar);
            p.Direction = ParameterDirection.Input;
            p.Value = data.direccionData ;
            parametros.Add(p);

            p = new SqlParameter("@psDireccion_Imagen_Front", SqlDbType.VarChar);
            p.Direction = ParameterDirection.Input;
            p.Value = data.imagenAnversa ;
            parametros.Add(p);

            p = new SqlParameter("@psDireccion_Imagen_Back", SqlDbType.VarChar);
            p.Direction = ParameterDirection.Input;
            p.Value = data.imagenReversa ;
            parametros.Add(p);

            SQL_Manager.stringConection = Configuracion.cadenaConexionBDData;
            int resultadoComando = SQL_Manager.EjecutarComando("Insertar_Cheque", parametros);
            return (resultadoComando > 0) ? resultadoComando : -1;
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="idCheque"></param>
        /// <param name="estado"></param>
        /// <param name="sinFechaEnvio"></param>
        /// <returns></returns>
        public static int ActualizarEstado(string idCheque, int estado,bool sinFechaEnvio=true)
        {
            List<SqlParameter> parameters = new List<SqlParameter>();

            SqlParameter parameter = new SqlParameter("@piDATOS_CHEQUES_PK", SqlDbType.Int);
            parameter.Direction = ParameterDirection.Input;
            parameter.Value = idCheque;
            parameters.Add(parameter);

            parameter = new SqlParameter("@piCodigo_Estado", SqlDbType.Int);
            parameter.Direction = ParameterDirection.Input;
            parameter.Value = estado;
            parameters.Add(parameter);

            SQL_Manager.stringConection = Configuracion.cadenaConexionBDData;

            int resultadoComando = -1;
            

            if (sinFechaEnvio)
                resultadoComando= SQL_Manager.EjecutarComando("Actualizar_Estado", parameters);
            
            else
                resultadoComando= SQL_Manager.EjecutarComando("Actualizar_Fecha_Envio", parameters);

            return (resultadoComando > 0) ? resultadoComando : -1;
            
        }

        public static int SQLDelete(int idCheque)
        {
            List<SqlParameter> parameters = new List<SqlParameter>();

            SqlParameter parameter = new SqlParameter("@piDATOS_CHEQUES_PK", SqlDbType.Int);
            parameter.Direction = ParameterDirection.Input;
            parameter.Value = idCheque;
            parameters.Add(parameter);

            SQL_Manager.stringConection = Configuracion.cadenaConexionBDData;

            

            int resultadoComando = SQL_Manager.EjecutarComando("Delete_Cheques_Vencidos", parameters);
            return (resultadoComando > 0) ? resultadoComando : -1;

        }

        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        public static List<Cheque> SQLReadToIIF()
        {

            List<Cheque> chequesList = new List<Cheque>();

            List<SqlParameter> parameters = new List<SqlParameter>();
            SqlParameter parameter = new SqlParameter("@piTipoConsulta", SqlDbType.Int);
            parameter.Direction = ParameterDirection.Input;
            parameter.Value = 1;
            parameters.Add(parameter);

            SQL_Manager.stringConection = Configuracion.cadenaConexionBDData;

            SqlDataReader readerS = SQL_Manager.EjecutarConsulta("Consultar_Cheques", parameters);
            if (readerS != null)
            {

                if (readerS.HasRows)
                {
                    if (readerS.FieldCount == 1)
                    {
                        Services.EnviarLog("Unisys Batch Importer", 152, "Error inesperado al ejecutar el store procedure", "SQLReadToIIF", Bitacora.TipoError.Error, new Exception(readerS.GetSqlValue(0).ToString()));
                        return null;
                    }

                        while (readerS.Read())
                        {


                            #region results
                            Cheque chequeObj = new Cheque();
                            try
                            {
                                chequeObj.IDCheque = Convert.ToInt32(readerS.GetSqlValue(readerS.GetOrdinal("DATOS_CHEQUES_PK")).ToString());
                            }
                            catch
                            {
                                chequeObj.IDCheque = 0;
                            }

                            try
                            {
                                chequeObj.estado = Convert.ToInt32(readerS.GetSqlValue(readerS.GetOrdinal("Codigo_Estado")).ToString());
                            }
                            catch
                            {
                                chequeObj.estado = 0;
                            }

                            try
                            {
                                chequeObj.fechaCarga = Convert.ToDateTime(readerS.GetSqlValue(readerS.GetOrdinal("Fecha_Carga")).ToString());
                            }
                            catch
                            {
                                chequeObj.fechaCarga = DateTime.Now;
                            }

                            chequeObj.direccionData = readerS.GetSqlValue(readerS.GetOrdinal("Direccion_Data")).ToString();

                            if (chequeObj.direccionData.ToUpper().Equals("NULL"))
                                chequeObj.direccionData = "";

                            chequeObj.imagenAnversa = readerS.GetSqlValue(readerS.GetOrdinal("Direccion_Imagen_Front")).ToString();

                            if (chequeObj.imagenAnversa.ToUpper().Equals("NULL"))
                                chequeObj.imagenAnversa = "";

                            chequeObj.imagenReversa = readerS.GetSqlValue(readerS.GetOrdinal("Direccion_Imagen_Back")).ToString();

                            if (chequeObj.imagenReversa.ToUpper().Equals("NULL"))
                                chequeObj.imagenReversa = "";

                            string DBCamara = readerS.GetSqlValue(readerS.GetOrdinal("Camara")).ToString();

                            chequeObj.camara = (Camara)BatchImporter_Fields.ClonacionAnidada<Camara>(Configuracion.parametrizacionCampos.BuscarCamara(DBCamara));

                            if (chequeObj.camara != null)
                            {
                                for (int i = 0; i < chequeObj.camara.camposValidos.Count; i++)
                                {
                                    if (chequeObj.camara.camposValidos[i].requerido)
                                    {
                                        chequeObj.camara.camposValidos[i].valor = readerS.GetSqlValue(readerS.GetOrdinal(chequeObj.camara.camposValidos[i].nombreBaseDatos)).ToString();

                                    }

                                }

                            }
                            else
                            {
                                Services.EnviarLog("Batch Importer", 0, "Error en datos en la base de datos", "SQLReadToIIF", Bitacora.TipoError.Error);
                            }

                            #endregion


                                chequesList.Add(chequeObj);

                        }
                    SQL_Manager.CerrarConexion();
                    return chequesList;

                }

                else
                {
                    SQL_Manager.CerrarConexion();
                    return new List<Cheque>();
                }
            }
            else
            { return null; }

        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="fechaValida"></param>
        /// <returns></returns>
        public static List<Cheque> SQLReadToDelete(DateTime fechaValida)
        {
            List<SqlParameter> parametrosSql = new List<SqlParameter>();
            SqlParameter parametro = new SqlParameter("@psFechaValida", SqlDbType.VarChar);
            parametro.Direction = ParameterDirection.Input;
            parametro.Value = fechaValida.ToString("dd/MM/yyyy");
            parametrosSql.Add(parametro);

            SQL_Manager.stringConection = Configuracion.cadenaConexionBDData;

            SqlDataReader reader = SQL_Manager.EjecutarConsulta("Consultar_Cheques_Vencidos", parametrosSql);
            if (reader != null)
            {

                if (reader.HasRows)
                {
                    if (reader.FieldCount == 1)
                    {
                        Services.EnviarLog("Batch Importer", 152, "Error inesperado al ejecutar el store procedure", "SQLReadToDelete", Bitacora.TipoError.Error, new Exception(reader.GetSqlValue(0).ToString()));
                        return null;
                    }

                    List<Cheque> cheques = new List<Cheque>();
                    while (reader.Read())
                    {
                        Cheque cheque = new Cheque();

                        #region results

                        try
                        {
                            cheque.IDCheque = Convert.ToInt32(reader.GetSqlValue(reader.GetOrdinal("DATOS_CHEQUES_PK")).ToString());
                        }
                        catch
                        {
                            cheque.IDCheque = 0;
                        }

                        cheque.direccionData = reader.GetSqlValue(reader.GetOrdinal("Direccion_Data")).ToString();

                        if (cheque.direccionData.ToUpper().Equals("NULL"))
                            cheque.direccionData = "";

                        cheque.imagenAnversa = reader.GetSqlValue(reader.GetOrdinal("Direccion_Imagen_Front")).ToString();

                        if (cheque.imagenAnversa.ToUpper().Equals("NULL"))
                            cheque.imagenAnversa = "";

                        cheque.imagenReversa = reader.GetSqlValue(reader.GetOrdinal("Direccion_Imagen_Back")).ToString();

                        if (cheque.imagenReversa.ToUpper().Equals("NULL"))
                            cheque.imagenReversa = "";


                        #endregion

                        cheques.Add(cheque);

                    }
                    SQL_Manager.CerrarConexion();
                    return cheques;

                }
                else
                {
                    SQL_Manager.CerrarConexion();
                    return null;
                }

            }
            else {
                return null;
            }
        }

        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        public static List<Cheque> LeerChequesRestantes()
        {
            List<SqlParameter> parametrosSql = new List<SqlParameter>();
            SqlParameter parametro = new SqlParameter("@piTipoConsulta", SqlDbType.Int);
            parametro.Direction = ParameterDirection.Input;
            parametro.Value = 2;
            parametrosSql.Add(parametro);

            SQL_Manager.stringConection = Configuracion.cadenaConexionBDData;

            SqlDataReader reader = SQL_Manager.EjecutarConsulta("Consultar_Cheques", parametrosSql);
            if (reader != null)
            {

                if (reader.HasRows)
                {
                    if (reader.FieldCount == 1)
                    {
                        Services.EnviarLog("Unisys Batch Importer", 152, "Error inesperado al ejecutar el store procedure", "LeerChequesRestantes", Bitacora.TipoError.Error, new Exception(reader.GetSqlValue(0).ToString()));
                        return null;
                    }

                    List<Cheque> cheques = new List<Cheque>();
                    while (reader.Read())
                    {
                        Cheque cheque = new Cheque();

                        #region results

                        try
                        {
                            cheque.IDCheque = Convert.ToInt32(reader.GetSqlValue(reader.GetOrdinal("DATOS_CHEQUES_PK")).ToString());
                        }
                        catch
                        {
                            cheque.IDCheque = 0;
                        }

                        cheque.imagenAnversa = reader.GetSqlValue(reader.GetOrdinal("Direccion_Imagen_Front")).ToString();

                        if (cheque.imagenAnversa.ToUpper().Equals("NULL"))
                            cheque.imagenAnversa = "";

                        cheque.imagenReversa = reader.GetSqlValue(reader.GetOrdinal("Direccion_Imagen_Back")).ToString();

                        if (cheque.imagenReversa.ToUpper().Equals("NULL"))
                            cheque.imagenReversa = "";


                        #endregion

                        cheques.Add(cheque);

                    }
                    SQL_Manager.CerrarConexion();
                    return cheques;

                }
                else
                {
                    SQL_Manager.CerrarConexion();
                    return null;
                }

            }
            else
            { return null; }
        }

        /// <summary>
        /// Método que permite conocer si el documento ya fue importado a InfoImage.
        /// </summary>
        /// <param name="fecha"></param>
        /// <param name="documento">Nombre del documento.</param>
        /// <param name="cuentaCliente">Cuenta cliente del documento a buscar.</param>
        /// <returns></returns>
        public static bool SQLWorkItemExiste(string fecha, string documento, string cuentaCliente)
        {
            List<SqlParameter> parametrosSql = new List<SqlParameter>();
            SqlParameter parameter = new SqlParameter("@psMov_Fecha", SqlDbType.VarChar);
            parameter.Direction = ParameterDirection.Input;
            parameter.Value = fecha;
            parametrosSql.Add(parameter);

            parameter = new SqlParameter("@psMov_Documento", SqlDbType.VarChar);
            parameter.Direction = ParameterDirection.Input;
            parameter.Value = documento;
            parametrosSql.Add(parameter);

            parameter = new SqlParameter("@psMov_Cuenta_Cliente", SqlDbType.VarChar);
            parameter.Direction = ParameterDirection.Input;
            parameter.Value = cuentaCliente;
            parametrosSql.Add(parameter);

            SQL_Manager.stringConection = Configuracion.cadenaConexionBDData;

            SqlDataReader reader = SQL_Manager.EjecutarConsulta("Consultar_Existencia_Cheque", parametrosSql);

            if (reader != null)
            {
                if (reader.HasRows)
                {
                    SQL_Manager.CerrarConexion();
                    return true;

                }
                else
                {
                    SQL_Manager.CerrarConexion();
                    return false;
                }
            }
            else { return false; }


        }

    }
}
